什么是内存泄漏, 如何检测和防止?

4 分钟阅读 449 字 + 535 词
参考答案
  1. 如果程序的某一段代码在内存池中动态申请了一块内存而没有及时将其释放,就会导致那块内存一直处于被占用的状态而无法使用,造成了资源的浪费。 内存泄漏并不是说物理上的消失掉了,是因为 无法使用该区域 ,在外界看来这块内存就好像被泄漏了一样。
  2. 什么操作会导致内存泄漏
    • 忘记释放内存 :使用 new malloc 等分配内存后,没有使用 delete free 释放内存。
    • 子类继承父类时 ,没有将 基类的析构函数定义为虚函数
    • 野指针 :指针被赋值为 nullptr 或重新赋值后,丢失了对先前分配内存的引用,导致无法释放。
    • 循环引用 :在使用引用计数的智能指针(如 std::shared_ptr )时,循环引用会导致引用计数永远不会归零,从而无法释放内存。
    • 使用不匹配的内存释放函数 : 使用 delete 释放由 new[] 分配的内存,或使用 delete[] 释放由 new 分配的内存,这可能导致未定义行为。
    • 资源未关闭 :对于文件、网络连接等资源,如果没有正确关闭,虽然不直接导致内存泄漏,但会占用系统资源,可能导致资源耗尽。
  3. 如何检测:使用工具如 Valgrind 、AddressSanitizer或Visual Studio的诊断工具来检测内存泄漏。
  4. 如何避免
    • 使用 智能指针 :优先使用 std::unique_ptr std::shared_ptr 等智能指针来自动管理内存。
    • 确保资源释放 : 对于手动分配的内存,确保在不再需要时使用 delete free 释放。
    • 内存泄漏检测工具: 在开发和测试阶段,定期使用内存泄漏检测工具检查程序。